package com.topdt.jbpm.web.struts.action;

import java.io.IOException;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import org.apache.commons.lang3.StringUtils;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.thx.common.struts2.CurdAction;
import com.thx.common.util.AppContext;
import com.thx.common.web.ActionResult;
import com.thx.log.LogUtil;
import com.topdt.jbpm.model.AppType;
import com.topdt.jbpm.model.Application;
import com.topdt.jbpm.service.AppTypeService;
import com.topdt.jbpm.service.ApplicationService;
import com.topdt.jbpm.service.JbpmService;
import com.topdt.jbpm.utils.ModuleConstant;

/**
 *  @Project       : thx-workflow
 *  @Program Name  : com.topdt.jbpm.web.struts.action.AppTypeAction.java
 *  @Class Name    : AppCataAction
 *  @Description   : 应用分类action(流程管理/应用分类)
 *  @Author        : calonlan
 *  @Creation Date : 2015年1月29日 上午10:30:55
 *  @ModificationHistory
 *  Who        When          What
 *  --------   ----------    -----------------------------------
 *  username   2015年1月29日       TODO
 */
@Namespace("/workflow")
@Action(value = "appCatalog",
		results = {
		@Result(name = "list", location = "/workflow/appCatalog/list.jsp"),
		@Result(name = "view", location = "/workflow/appCatalog/detail.jsp"),
		@Result(name = "json", type = "json", params = { "root", "result" }),
		@Result(name = "input", location = "/workflow/appCatalog/input.jsp")
		}
)
@Controller
@Scope("prototype")
public class AppCatalogAction extends CurdAction<AppType> {

	/**
	 * serialVersionUID : TODO（用一句话描述这个变量表示什么）
	 * @since   : v1.00
	 */
	private static final long serialVersionUID = 1L;

	@Autowired
	private AppTypeService appTypeService;
    @Autowired
    private ApplicationService appService;
    private JbpmService jbpmService  = JbpmService.getJbpmService();

	@Override
	protected void doList() throws Exception {
		logger.debug("<进入>:doList方法");
		list = appTypeService.getAllByCompanyId();
	}
	@Override
	protected void doInput() throws Exception {
		logger.debug("<进入>:doInput方法");
		if (StringUtils.isNotBlank(id)) {
			entity = appTypeService.get(id);
			if (entity == null) {
				setResult(ActionResult.FAIL, "要修改的记录不存在！！！");
			}
		}
	}

	@Override
	protected void doSave() throws Exception {
		logger.debug("<进入>:doSave方法    新增或修改应用类型");
		if (StringUtils.isBlank(id)) {
			entity.setTypeName(StringUtils.strip(entity.getTypeName()));
			entity.setTypeCode(StringUtils.strip(entity.getTypeCode()));
			entity.setCompanyId(AppContext.getCurrentComId());
			appTypeService.save(entity);
			setResult(ActionResult.SUCCESS, "添加成功！");
			LogUtil.log(ModuleConstant.APP_TYPE, LogUtil.ACTION_ADD, LogUtil.RESULT_SUCCESS, "新增应用类型");

		} else {
			AppType appType = appTypeService.get(id);
			appType.setTypeName(StringUtils.strip(entity.getTypeName()));
			appType.setTypeCode(StringUtils.strip(entity.getTypeCode()));
			appTypeService.save(appType);
			setResult(ActionResult.SUCCESS, "修改成功！");
			LogUtil.log(ModuleConstant.APP_TYPE, LogUtil.ACTION_UPDATE, LogUtil.RESULT_SUCCESS, "修改应用类型");

		}
	}

	@Override
	protected void doDelete() throws Exception {
		logger.debug("<进入>:doDelete方法    删除应用类型");
		if (StringUtils.isNotBlank(id)) {
			List<Application>  appList = appService.findAppsByType(id);
			if(appList!=null&&appList.size()>0){
				setResult(ActionResult.FAIL, "该类型下有应用，无法删除！");
			}else{
				appTypeService.delete(id);
				setResult(ActionResult.SUCCESS, "删除成功！！！");
				LogUtil.log(ModuleConstant.APP_TYPE, LogUtil.ACTION_DELETE, LogUtil.RESULT_SUCCESS, "删除应用类型");
			}
		} else {
			setResult(ActionResult.FAIL, "服务器异常！");
		}
	}


	/**
	 *  @Description    : 验证应用类型名称是否唯一
	 *  @Method_Name    : checkTypeName
	 *  @return         : void
	 *  @Creation Date  : 2015年3月20日 下午5:42:53
	 *  @version        : v1.00
	 *  @Author         : calonlan

	 *  @Update Date    : 2015年3月20日 下午5:42:53
	 *  @Update Author  : calonlan
	 */
	public void checkTypeName() {
		logger.debug("<进入>:checkTypeName方法    验证应用类型名称是否唯一");
		List<AppType> list = appTypeService.findByName(entity.getTypeName());

			try {
				if (list == null || list.size() <= 0 ) {
					writeJson("true");
				} else {
					if (list.get(0).getTypeId().equals(id)) {
						writeJson("true");
					} else {
						writeJson("false");
					}
				}
			} catch (IOException e) {
				logger.error("<错误>:验证应用类型名称是否唯一失败",e);
				setResult(ActionResult.FAIL, "服务器异常！");
			}
	}

	/**
	 * 查询配置中的所有应用
	 * @author 刘杰
	 * @date   2016年1月24日 下午3:08:23
	 */
	public void getAllDocumentApps(){
		logger.debug("<进入>:getAllDocumentApps方法    查询配置中的所有应用");
		List<AppType> appTypes = jbpmService.findAllAppType();
		Set<Application> appResult = new TreeSet<Application>();
		String officeDocTypes = AppContext.getProperties("showOfficeDocTypes");
		for(AppType at:appTypes){
			Set<Application> apps = at.getApps();
			for(Application app:apps){
				if("0".equals(app.getIsValid())||"0".equals(app.getIsComplete())) continue;
				if(Application.APPATTR_DOC.equals(app.getAppAttr())
						|| Application.APPATTR_CUSTOM_DOC.equals(app.getAppAttr())
						|| Application.APPATTR_CUSTOM_DOC_OPINION.equals(app.getAppAttr())){
					appResult.add(app);
				}
			}
		}
		JSONArray json = new JSONArray();
        for(Application a : appResult){
        	boolean ifDocApp = false;
        	if(StringUtils.isNotBlank(officeDocTypes)){
        		String typeName = a.getAppType().getTypeName();
            	String[] types =  officeDocTypes.split(",");
            	for(String type:types){
            		if(type.equals(typeName)){
            			ifDocApp = true;
            		}
            	}
        	}
        	if(ifDocApp){
        		JSONObject jo = new JSONObject();
                jo.put("id", a.getAppId());
                jo.put("name", a.getAppName());
                json.add(jo);
        	}
        }
		try {
			writeJson(json.toString());
		} catch (IOException e) {
			logger.error("<错误>:查询配置中的所有应用失败",e);
		}
	}

}
